package org.example.study7;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class Demo_701 {
    public static void main(String[] args) throws InterruptedException {
        // 创建一个容量为3的阻塞队列（LinkedBlockingQueue）
        // 作用: 线程安全的队列，支持在队列满时阻塞生产者线程（put()），队列空时阻塞消费者线程（take()）
        BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(3);

        /*阻塞方法:
        put(E e): 队列满时阻塞，直到有空间插入。
        take(): 队列空时阻塞，直到有元素可取。*/

        // 向队列添加3个元素（队列满）
        queue.put(1); // 元素1入队
        queue.put(2); // 元素2入队
        queue.put(3); // 元素3入队，队列已满（容量3）
        System.out.println("已经添加了3个元素");

        // 尝试添加第4个元素（注释掉的代码）
        // queue.put(4); // 队列已满，put()会阻塞当前线程，后续代码无法执行
        // System.out.println("已经添加了4个元素"); // 永远不会执行

        // 从队列取出3个元素（队列空）
        System.out.println(queue.take()); // 取出1，队列剩余2元素
        System.out.println(queue.take()); // 取出2，队列剩余1元素
        System.out.println(queue.take()); // 取出3，队列为空
        System.out.println("已经取出了3个元素");

        // 尝试取出第4个元素（队列空，take()阻塞）
        System.out.println(queue.take()); // 队列空，take()阻塞，后续代码无法执行
        System.out.println("已经取出了4个元素"); // 永远不会执行
    }
}

// 运行：
/*
已经添加了3个元素
1
2
3
已经取出了3个元素*/

/*应用场景
生产者-消费者模型: 多个线程安全地共享数据。
任务调度: 线程池使用阻塞队列管理待执行任务。
流量削峰: 在高并发场景中缓冲突发请求。*/


/*注意事项
单线程陷阱: 本例在单线程中顺序调用put()和take()，导致阻塞后无法恢复。实际使用中需配合多线程（如生产者线程和消费者线程分离）。
死锁风险: 若所有线程因队列满/空永久阻塞，需设计超时机制（如offer(e, timeout)和poll(timeout)）。
*/